/*******************************************************************************
* Lempel Ziv Storer Szymanski (LZSS)
*
* File     : benchmark.c
* Autore   : Gianluca Costante
*
*******************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <time.h>
#include "benchmark.h"

/*******************************************************************************
 *   VARIABILI
 ******************************************************************************/

/* variabile usata per salvare il tempo iniziale di esecuzione 
 * static: variabile visibile solo all'interno di questo file */
static clock_t start;

/*******************************************************************************
 *   FUNZIONI
 ******************************************************************************/

/*******************************************************************************
*   Funzione    : FileSize
*   Descrizione : Calcola la dimensione di un file
* 
*   Parametri   : fileName - nome del file 
*   Ritorna     : la dimensione del file in bytes
*******************************************************************************/
long double FileSize(char *fileName){
    
    /* struttura stat
     * info: http://en.wikipedia.org/wiki/Sys/stat.h#Member_types */
    struct stat sb;
    
    /* controllo se stats incontra un qualche errore, eventualente stampo un 
     * pesssaggio di errore */
    if (stat(fileName, &sb) == -1) {perror("stat");}
    
    /* restituisco il campo st_size che contiene il numero di bytes di cui e' 
     * composto il file */
    return (long double) sb.st_size;
}

/*******************************************************************************
*   Funzione    : EncodeInfo
*   Descrizione : Stampa alcune informazioni sulla compressione
* 
*   Parametri   : fileIn  - nome del file di input
*                 fileOut - nome del file di output
*   Ritorna     : Niente
*******************************************************************************/
void EncodeInfo(char *fileIn, char *fileOut){
    
    long double sizeIn = FileSize(fileIn);
    long double sizeOut = FileSize(fileOut);
    
    printf("\n");
    
    printf("Input file   : %s (%.0Lf bytes) \n", fileIn, sizeIn);
    printf("Output file  : %s (%.0Lf bytes) \n", fileOut, sizeOut);
    
    printf("Compressione : %.3Lf %% \n", 100 - ((sizeOut/sizeIn)*100));
    printf("Esecuzione   : %.3f s \n", ((double)clock()-start)/CLOCKS_PER_SEC); 
    
    printf("\n");
}

/*******************************************************************************
*   Funzione    : DncodeInfo
*   Descrizione : Stampa alcune informazioni sulla decompressione
* 
*   Parametri   : fileIn  - nome del file di input
*                 fileOut - nome del file di output
*   Ritorna     : Niente
*******************************************************************************/
void DecodeInfo(char *fileIn, char *fileOut){
    
    long double sizeIn = FileSize(fileIn);
    long double sizeOut = FileSize(fileOut);
    
    printf("\n");
    
    printf("Input file     : %s (%.0Lf bytes) \n", fileIn, sizeIn);
    printf("Output file    : %s (%.0Lf bytes) \n", fileOut, sizeOut);
    
    printf("Decompressione : %.3Lf %% \n", 100 - ((sizeIn/sizeOut)*100));
    printf("Esecuzione     : %.3f s \n", ((double)clock()-start)/CLOCKS_PER_SEC); 
    
    printf("\n");
}

/*******************************************************************************
*   Funzione    : StartClock
*   Descrizione : Avvia il timer per il calcolo dei tempi di esecuzione
* 
*   Parametri   : Nessuno
*   Ritorna     : Niente
*******************************************************************************/
void StartClock(){
    
    start = clock();
}
